컴퓨터과학
어셈블리_04_스택 메모리 관리 기법
작성자 : Heehyeon Yoo|2025-10-10
# Assembly# Stack# Memory# LIFO
컴퓨터 메모리 영역 중 프로그램의 실행 흐름 제어와 밀접한 관련이 있는 곳이 스택(Stack)이다. 지역 변수 할당, 함수 호출 시의 복귀 주소 관리 등 핵심적인 로직이 스택에서 이루어진다.
1. 스택의 동작 원리(LIFO)
스택은 나중에 들어간 데이터가 먼저 나오는 LIFO(Last In, First Out) 구조를 가진다.(접시를 쌓을 때 맨 위에 올리고, 꺼낼 때도 맨 위에서 꺼내는 것과 같다)
어셈블리어에서는 다음 두 명령어로 스택을 조작한다.
- PUSH: 스택의 최상단(Top)에 데이터를 저장한다.
- POP: 스택의 최상단 데이터를 꺼낸다.
2. 메모리 성장 방향
스택은 일반적인 데이터와 달리 메모리 주소가 높은 곳에서 낮은 곳으로 자라난다.
- 일반 데이터: 0x100 -> 0x108 (증가)
- 스택 (PUSH): 0x7FFF -> 0x7FF8 (감소)
PUSH 명령을 실행하면 스택 포인터(RSP)의 값은 감소하고, POP을 실행하면 증가한다. 이는 스택이 고정된 메모리 상위 영역(High Memory)에서 시작하여 하위 영역(Low Memory)으로 확장되는 구조이기 때문이다.
반면, 동적으로 할당되는 힙(Heap) 메모리는 낮은 주소에서 높은 주소 방향으로 자라난다. 이 두 영역이 서로 침범하지 않도록 관리하는 것이 메모리 설계의 핵심이다.
3. 스택의 용도
개발자가 스택을 사용하는 주된 이유는 다음과 같다.
- 복귀 주소(Return Address) 저장: 함수 호출(
CALL) 시, 실행이 끝난 후 돌아올 원래 코드의 주소를 스택에 백업한다. - 레지스터 백업: 레지스터의 개수는 제한적이므로, 기존 값을 잠시 보관해야 할 때 스택을 임시 저장소로 사용한다.
- 지역 변수 할당: 함수 내부에서만 사용되는 변수들을 위해 스택 공간을 할당한다. 함수 종료 시
RSP를 되돌리는 것만으로 빠르게 메모리를 해제할 수 있다.
스택 영역에 저장된 "복귀 주소"를 조작하여 악성 코드를 실행하게 만드는 것이 버퍼 오버플로우(Buffer Overflow) 공격의 기본 원리다.(입력값을 검증하지 않아 스택의 버퍼를 넘치게 채우면, 결국 그 뒤에 있는 복귀 주소까지 덮어쓰게 되는 원리다)